package main

import (
	"fmt"
)

/*
*
缓冲通道
缓冲通道就是指一个通道，带有一个缓冲区。发送到一个缓冲通道只有在缓冲区满时才被阻塞。类似地，从缓冲通道接收的信息只有在缓冲区为空时才会被阻塞。

可以通过将额外的容量参数传递给make函数来创建缓冲通道，该函数指定缓冲区大小
ch := make(chan type, capacity)

非缓冲通道： make(chan T)

	一次发送，一次接受，都是阻塞的

缓冲通道： make(chan T, capacity)

	发送：缓冲区的数据满了，才会阻塞
	接收：缓冲区的数据空了，才会阻塞
*/
func main() {
	// 非缓冲区通道
	ch1 := make(chan int)
	fmt.Println(len(ch1), cap(ch1))

	// 缓冲区通道
	ch2 := make(chan int, 5)
	go sendData2(ch2)
	for v := range ch2 { // 会自动判断通道是否关闭，通道关闭自动退出循环
		fmt.Println(v)
	}
}

func sendData2(ch1 chan int) {
	for i := 0; i < 10; i++ {
		ch1 <- i
		fmt.Println("data", i)
	}
	close(ch1) // 通知对方，通道关闭
}
